package com.ssy.lingxi.contract.service;

import com.ssy.lingxi.after.sale.api.model.vo.request.ReturnListGoodsDetailVO;
import com.ssy.lingxi.after.sale.api.model.vo.response.ReturnGoodsDetailListResponse;
import com.ssy.lingxi.after.sale.api.model.vo.response.ReturnGoodsInfoVO;
import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.contract.api.model.vo.request.ContractOrderListRequest;
import com.ssy.lingxi.contract.entity.ApplyAmountOrderDO;
import com.ssy.lingxi.contract.entity.ContractDO;
import com.ssy.lingxi.contract.model.vo.common.response.ContractOrderPageResponse;
import com.ssy.lingxi.dto.request.ApplyAmountDetailSunQueryVO;
import com.ssy.lingxi.dto.request.ApplyAmountDetailTotalSunQueryVO;
import com.ssy.lingxi.dto.request.ApplyAmountSunQueryVO;
import com.ssy.lingxi.dto.request.InvoiceProveGetVO;
import com.ssy.lingxi.dto.response.*;
import com.ssy.lingxi.message.api.vo.request.SystemMessageRequest;
import com.ssy.lingxi.order.api.model.vo.request.OrderContractFeignVO;
import com.ssy.lingxi.order.api.model.vo.response.OrderAfterSaleOrderContractFeignVO;
import com.ssy.lingxi.order.api.model.vo.response.OrderAfterSaleStatusVO;
import com.ssy.lingxi.product.api.model.request.feign.CommodityPriceRequest;
import com.ssy.lingxi.product.api.model.response.feign.CommoditySkuStockResponse;
import com.ssy.lingxi.report.api.vo.request.OperateNoticeVO;

import java.util.List;

/**
 * 内部接口定义
 * @author 伍将
 * @date 2021/3/1
 * @version 2.0.0
 */
public interface IFeignService {

    /**
     * 更新合同来源
     * @author 伍将
     * @date 2021/3/3
     * @param contractDO: 合同
     * @param isRecovery: 是否还原：false-否，true-是
     * @return 操作结果
     **/
    Wrapper<Void> updateContractSource(ContractDO contractDO, Boolean isRecovery);

    /**
     * 新增结算请款单
     * @author 伍将
     * @date 2021/3/24
     * @param entity: 请款单
     * @param totalCount: 总单数
     * @return 操作结果
     **/
    Wrapper<Void> addSettlementApplyAmount(ApplyAmountOrderDO entity, Long totalCount);

    /**
     * 根据退款单ids,查询退款单（状态）信息
     * @author 伍将
     * @date 2021/3/24
     * @param orderIds: 订单ids
     * @return 操作结果
     **/
    List<ReturnGoodsInfoVO> getReturnGoodsInfoListByIds(List<Long> orderIds);

    /**
     * 根据单据编号+结算类型，获取单据[发票凭证]信息列表
     * @param invoiceProveGetVO 查询请求
     * @return 单据[发票凭证]信息列表
     */
    List<InvoiceProveVO> getInvoiceProve(InvoiceProveGetVO invoiceProveGetVO);

    /**
     * 查询会员对公账户
     * @param memberId 会员id
     * @param memberRoleId 角色id
     * @return 对公账户
     */
    Wrapper<CorporateAccountConfigResponse> getCorporateAccountConfig(Long memberId, Long memberRoleId);

    /**
     * 批量查询订单状态。
     * @param orderIds 订单id集合
     * @return 查询订单状态。
     */
    List<OrderAfterSaleStatusVO> getOrderStateList(List<Long> orderIds);

    /**
     * 查询合同下的单据[退款单]
     * @param request 查询请求
     * @return 合同下的单据[退款单]
     */
    List<ReturnGoodsDetailListResponse> getContractRefundOrderList(ReturnListGoodsDetailVO request);

    /**
     * 查询合同下的单据[订单]
     * @param request 查询请求
     * @return 合同下的单据[订单]
     */
    List<OrderAfterSaleOrderContractFeignVO> getContractOrderList(OrderContractFeignVO request);

    /**
     * 查询合同订单list(订单与退款单)
     * @param sysUser 登录用户
     * @param request 查询请求
     * @return 合同订单list(订单与退款单)
     */
    List<ContractOrderPageResponse> getContractOrderAndReturnList(UserLoginCacheDTO sysUser, ContractOrderListRequest request);

    /**
     * 发送系统消息
     * @param request 系统消息
     */
    void sendSystemMessage(SystemMessageRequest request);

    /**
     * 批量发送系统消息
     * @param request 系统消息
     */
    void batchSendSystemMessage(List<SystemMessageRequest> request);
    /**
     * 新增系统操作通知[首页各状态待办计数]
     * @author ds
     * @date 2021/6/1
     * @param noticeVO: 请求参数
     **/
    void addSysOperateNoticeToMQ(OperateNoticeVO noticeVO);
    /**
     * 新增系统操作通知[首页各状态待办计数]
     * @author ds
     * @date 2021/6/1
     * @param noticeVOs: 请求参数
     **/
    void addSysOperateNoticeToMQ(List<OperateNoticeVO> noticeVOs);

    /**
     * 根据商品id，获得仓位库存
     * @param request 查询请求
     * @return 仓位库存
     */
    Wrapper<List<CommoditySkuStockResponse>> getCommoditySkuStock(CommodityPriceRequest request);

    /**
     * 结算服务-查询请款执行请款
     * @param queryVO 查询请求
     */
    Wrapper<PageData<ApplyAmountDetailSunVO>> pageContractExecuteDetail(ApplyAmountDetailSunQueryVO queryVO);

    /**
     * 结算服务-查询 请款执行请款汇总
     * @param queryVO 查询请求
     * @return  请款执行请款汇总
     */
    Wrapper<List<ApplyAmountDetailTotalSunVO>> pageContractExecuteDetailSum(ApplyAmountDetailTotalSunQueryVO queryVO);

    /**
     * 结算服务- 查询 合同请款情况统计
     * @param queryVO 查询条件
     * @return 合同请款情况统计
     */
    Wrapper<PageData<ApplyAmountSunVO>> pageListForSummary(ApplyAmountSunQueryVO queryVO);

    /**
     * 结算服务- 查询 合同请款付款情况统计
     * @param queryVO 查询条件
     * @return 合同请款付款情况统计
     */
    Wrapper<List<ApplyAmountSunVO>> listForPaySummaryByParty(ApplyAmountSunQueryVO queryVO);
}
